#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{	
	//左移操作符

	int a = 5;		//补码00000000 00000000 00000000 00000101	原码值为5
	int b = a << 1;	//补码00000000 00000000 00000000 00001010	原码值为10
	printf("%d\n", a);//位操作符后，a的值不变					相当于  *2
	printf("%d\n", b);
	printf("\n");
	int c = -5;		//补码11111111 11111111 11111111 11111011	原码值为-5
	int d = c << 1;	//补码11111111 11111111 11111111 11110110	原码值为-10
					//											相当于	*2
					//此时检测符号位是否为1，为1怎按负数补码处理，为0则直接输出
					//反码11111111 11111111 11111111 11110101
					//原码10000000 00000000 00000000 00001010
	printf("%d\n", c);//打印出来的是原码
	printf("%d\n", d);
	printf("\n");
	int e = -2147483647;									//	原码值为-2147483647
//11111111 11111111 11111111 11111111原码
//10000000 00000000 00000000 00000000反码
//10000000 00000000 00000000 00000001补码
	int f = e << 1;											//	原码值为2
	printf("%d\n", e);//10000000 00000000 00000000 00000001补码
	printf("%d\n", f);//0000000 00000000 00000000 000000010补码
	printf("\n");
//左边丢弃，右边补零（丢了符号位）
	//-2147483647
//11111111 11111111 11111111 11111111原码
//10000000 00000000 00000000 00000000反码
//10000000 00000000 00000000 00000001补码


	//右移操作符
	int g = -5;		//11111111 11111111 11111111 11111011补码
	int h = g >> 1;	//11111111 11111111 11111111 11111101补码
					//10000000 00000000 00000000 00000011原码
					//此编译器为
					//算数右移：符号位补原来的符号位
					//如若为逻辑右移：
					//符号位补零
	printf("%d\n", g);
	printf("%d\n", f);
	return 0;
}
